; 
; ***************************************************************************************************************
; * MUSIC PLAYER ON THE PSG
; ***************************************************************************************************************
FUNCTION	MUSIC	MPISDC,MPIPSG,OPCODE,PR1,PR2,ADDR1
REM	; music( mpisdc,mpipsg,opcode,pr1,pr2,addr1)  0=restoreirq 1=setupirq 2=PLAYonce,speed,block,addr1  3=play
REM	; 4=stop midi  5=resume  6=playsfx ,0,0,addr1 (7=P-R ON A)
DEF	OPCODE	BYTE
DEF	PR1	BYTE
DEF	PR2	BYTE
DEF	ADDR1	WORD
DEF	MPISDC	BYTE
DEF	MPIPSG	BYTE
OPCODE	FCB	0
PR1	FCB	0
PR2	FCB	0
ADDR1	FCB	0,0
YMMEMA	EQU	$FF5A
YMMEMB	EQU	$FF5B
YMCTRL	EQU	$FF5D
YMREG	EQU	$FF5E
YMDATA	EQU	$FF5F
MPIPSG	FCB	0
MPISDC	FCB	0
CARTSEL	FCB	0
BOOT	FCB	0
MSTVOL	FCB	13	;MAX VOL
VOL1	FCB	0
VOL2	FCB	0
VOL3	FCB	0
VOL4	FCB	0
NOTE1	FCB	0
NOTE2	FCB	0
NOTE3	FCB	0
NLEN1	FCB	0
NLEN2	FCB	0
NLEN3	FCB	0
NLEN4	FCB	2
GGG	FCB	0,0,0,0
SPOS	FCB	0,0	;SONG POSITION
SSTART	FCB	0,0	;SONG STARTING POINT
SCNT	FCB	0	;SONG COUNTER
VCNT	FCB	0
PLAYSPD	FCB	0
PLAYHALF	FCB	0
PLAYCNT	FCB	0
PLAY	FCB	0	;PLAY? 2=SETUP PLAY ONCE 1=PLAYING 3=LOOP PLAY
LOOPY	FCB	0
BLOCK	FCB	0	;using mem block or not
SAVEBLOCK	FCB	0
VCNT1	FCB	2
VCNT2	FCB	2
VCNT3	FCB	2
VCNT4	FCB	2
PERCUS	FCB	0
PERCNT	FCB	0
IRQ	FCB	0,0
KEY	FCB	1	; TONE ADJUSTMENT
MODEPL	FCB	48	;48,49
PLAYSFX	FCB	0	;play sfx?
PLAYSFXPOS	FCB	0,0
PLAYSFXSTART	FCB	0,0
PLAYSFXDEL	FCB	0
PLAYSFXCNT	FCB	0
SFXOCTAVE	FCB	3	;octave default
SFXTONE	FCB	0
SFXVOL	FCB	14	;sfx volume
PLAYSPEED	FCB	0,0
	FCB	0,1
	FCB	1,1
	FCB	1,2
	FCB	2,2
	FCB	2,3
	FCB	3,3
	FCB	3,4
	FCB	4,4
	FCB	4,5
	FCB	5,5
	FCB	5,6
	FCB	6,6	;12 max
; M,N percussion
; V0,V7 volume 7=max
; O1,O9 octaves
; T0, T9 tempo 9 longest
; P0, P9 pause / DELAY
; ABCDEFGHIJKL fast tones
; TONES
PSGDAT	FCB	15,209	; 0 b
	FCB	14,239	; 1 c
	FCB	14,24	; 1 c#
	FCB	13,77	; 1 d
	FCB	12,142	; 1 d#
	FCB	11,218	; 1 e
	FCB	11,48	; 1 f
	FCB	10,143	; 1 f#
	FCB	9,247	; 1 g
	FCB	9,107	; 1 g#
	FCB	8,225	; 1 a
	FCB	8,97	; 1 a#
; extend
	FCB	15,209	; 0 b
	FCB	14,239	; 1 c
	FCB	14,24
	FCB	13,77
	FCB	12,142
	FCB	11,218
	FCB	11,48
	FCB	10,143
	FCB	9,247
	FCB	9,107
	FCB	8,225
	FCB	8,97
	FCB	7,233
	FCB	7,119	; 2 c
	FCB	7,12
	FCB	6,167
	FCB	6,71
	FCB	5,237
	FCB	5,152
	FCB	5,71
	FCB	4,252
	FCB	4,180
	FCB	4,112
	FCB	4,49
	FCB	3,244
	FCB	3,188	; 3 c
	FCB	3,134
	FCB	3,83
	FCB	3,36
	FCB	2,246
	FCB	2,204
	FCB	2,164
	FCB	2,126
	FCB	2,90
	FCB	2,56
	FCB	2,24
	FCB	1,250
	FCB	1,222	; 4 c
	FCB	1,195
	FCB	1,170
	FCB	1,146
	FCB	1,123
	FCB	1,102
	FCB	1,82
	FCB	1,63
	FCB	1,45
	FCB	1,28
	FCB	1,12
	FCB	0,253
	FCB	0,239	; 5 c
	FCB	0,225
	FCB	0,213
	FCB	0,201
	FCB	0,190
	FCB	0,179
	FCB	0,169
	FCB	0,159
	FCB	0,150
	FCB	0,142
	FCB	0,134
	FCB	0,127
	FCB	0,119	; 6 c
	FCB	0,113
	FCB	0,106
	FCB	0,100
	FCB	0,95
	FCB	0,89
	FCB	0,84
	FCB	0,80
	FCB	0,75
	FCB	0,71
	FCB	0,67
	FCB	0,63
	FCB	0,60	; 7 c
	FCB	0,56
	FCB	0,53
	FCB	0,50
	FCB	0,47
	FCB	0,45
	FCB	0,42
	FCB	0,40
	FCB	0,38
	FCB	0,36
	FCB	0,34
	FCB	0,32
	FCB	0,30	; 8 c
	FCB	0,28
	FCB	0,27
	FCB	0,25
	FCB	0,24
	FCB	0,22
	FCB	0,21
	FCB	0,20
	FCB	0,19
	FCB	0,18
	FCB	0,17
	FCB	0,16
; over extended
	FCB	0,15	; 9 c
	FCB	0,14
	FCB	0,13
	FCB	0,12
	FCB	0,11
	FCB	0,10
	FCB	0,9
	FCB	0,8
	FCB	0,7
	FCB	0,6
	FCB	0,5
	FCB	0,4
; END TONES
MUSIC	LDA	OPCODE
	LBEQ	KILLIRQ	; disable irq
	CMPA	#1
	LBEQ	SETUPPSG	;enable irq music engine
	CMPA	#2
	BEQ	SETUPMUSIC
	CMPA	#3
	BEQ	SETUPMUSIC
	CMPA	#4
	BEQ	STOPMYMUSIC
	CMPA	#5
	BEQ	RESUMEMYMUSIC
	CMPA	#6
	BEQ	SETUPMYSFX
	CMPA	#7
	BEQ	REPORTPLAY
	RTS
REPORTPLAY	LDA	PLAY
	RTS
; ******************************************************
; * irq disable but keeps timer going
; ******************************************************
; new clock ticker
; sam accelorator at 3ff1
; ramrom at 3ff0
NEWIRQ	LDD	$112
	INCB
	BEQ	INCA1
	BRA	DONECLOCK
INCA1	INCA
	BEQ	RESTA
	BRA	DONECLOCK
RESTA	LDD	#0
DONECLOCK	STD	$112	;fix counter
	LDA	$FF02
	RTS	;maybe rts	
; 
; **********************************************
; * setup sfx for playback
; *********************************************
SETUPMYSFX	LDD	ADDR1
	STD	PLAYSFXSTART
	STD	PLAYSFXPOS
	LDA	#1
	STA	PLAYSFX
	RTS
STOPMYMUSIC	CLR	PLAY
	RTS
RESUMEMYMUSIC	LDA	#1
	STA	PLAY
	LDA	PR1
	STA	PLAYSPD
	RTS
; *******************************
; * setupmusic
; *******************************
SETUPMUSIC	LDD	ADDR1
	STD	SPOS
	STD	SSTART
	CLR	PLAYHALF	;read part 2
	LDA	PR1
	STA	PLAYSPD
	LDA	PR2
	STA	BLOCK
	CLR	LOOPY	;no looping default
	LDA	#1
	STA	PLAY
	LDA	#13
	STA	MSTVOL
	CLR	VOL1
	CLR	VOL2
	CLR	VOL3
	CLR	VOL4
	CLR	NOTE1
	CLR	NOTE2
	CLR	NOTE3
	CLR	NLEN1
	CLR	NLEN2
	CLR	NLEN3
	LDA	#2
	STA	NLEN4
	CLR	SCNT
	CLR	VCNT
	CLR	PLAYHALF
	CLR	PLAYCNT
	LDA	#2
	STA	VCNT1
	STA	VCNT2
	STA	VCNT3
	STA	VCNT4
	CLR	PERCUS
	CLR	PERCNT
; KEY	FCB	1	; TONE ADJUSTMENT
	LDA	OPCODE
	CMPA	#2
	BEQ	DONESETUP0
	CMPA	#3
	BNE	DONESETUP0
	INC	LOOPY
DONESETUP0	RTS
;
; ***********************
; * disable vectors
; ***********************
KILLIRQ	ORCC	#$50
	LDD	IRQ
	STD	$010D
	ANDCC	#$EF
	RTS	;RETURN FROM JSR
; *******************************************************************************************************************
; * setup the vectors
; *******************************************************************************************************************
; ok
SETUPPSG	ORCC	#$50
	LDD	#NEWIRQ	; new exit
	STD	IRQ
	LDX	#PSGPLAY
	STX	$010D
	ANDCC	#$EF
	RTS	;RETURN FROM JSR
; 
; *******************************
; * PSGPLAY
; *******************************
; IRQ On
PSGPLAY	LDD	$112
	INCB
	BEQ	INCA2
	BRA	DONECLOCK2
INCA2	INCA
	BEQ	RESTA2
	BRA	DONECLOCK2
RESTA2	LDD	#0
DONECLOCK2	STD	$112	;fix counter
; setup sound
	LDA	MPIPSG
	CMPA	MPISDC
	BEQ	SKIPBLOCK	;test
	LDB	MPISDC
	ANDB	#240
	STB	CARTSEL
	LDB	MPIPSG
	ANDB	#15
	ADDB	CARTSEL
	STB	$FF7F
	LDA	#22
	STA	YMCTRL
	LDA	MPIPSG
	STA	$FF7F
; READY
SKIPBLOCK	LDA	PLAY	;CHECK THE PLAYER
	BEQ	NOPLAY	;no music
	JSR	PLAYME	;yes music
; IRQ BACK
NOPLAY	JSR	SFXPLAY
	JSR	SETVOLUMES
	LDA	MPISDC
	CMPA	MPIPSG
	BEQ	NOMPIUSE
	STA	$FF7F
NOMPIUSE	LDA	$FF02
	RTI
; exit
; ************************************
; * the payload!
; ************************************
PLAYME	CLRA
;	STA	$FFDF	;ramram
; ram ram mode for safety
	LDA	PLAYSFX
	BNE	MYLOOP0	;bypass as sfx controller is present
	LDA	PERCUS
	BEQ	SETREGNOSND
	LDA	PERCNT
	BEQ	KILLPERC
	DEC	PERCNT
	LDA	#7
	STA	YMREG
	LDA	#49
	NOP
	NOP
	STA	YMDATA	;enables sound
	BRA	MYLOOP0
KILLPERC	CLR	PERCUS
	CLR	PERCNT
SETREGNOSND	LDA	#7
	STA	YMREG
	LDA	#56
	NOP
	NOP
	STA	YMDATA	;enables sound
MYLOOP0	LDA	PLAYCNT
	BEQ	YUPPLAY
	DEC	PLAYCNT
	RTS
YUPPLAY	LDY	#PLAYSPEED	;ref
	LDA	PLAYSPD
	LDB	#2
	MUL
	LEAY	B,Y
	LDB	PLAYHALF
	LEAY	B,Y
	LDA	0,Y
	STA	PLAYCNT
	INC	PLAYHALF
	LDA	PLAYHALF
	CMPA	#2
	BLO	NODELAY
	CLR	PLAYHALF
; process next commands
NODELAY	LDY	SPOS
MYLOOP	LDA	,Y+	;the command
	CMPA	#14
	BLS	SETDELAY
	CMPA	#15
	BEQ	SETDELAY2
	CMPA	#16
	LBEQ	SETCHAN1
	CMPA	#17
	LBEQ	SETCHAN2
	CMPA	#18
	LBEQ	SETCHAN3
	CMPA	#19
	LBEQ	PERC1
	CMPA	#20
	LBEQ	PERC2
	CMPA	#21
	BEQ	RESETSND
	BRA	MYLOOP
SETDELAY	STA	SCNT
	LDU	#PLAYSPEED	;ref
	LDA	PLAYSPD
;	LDB	#2
;	MUL
;	LEAU	B,U
;	LDB	PLAYHALF
;	LEAU	B,U
;	LDA	0,U
;	LDA	PLAYSPD
	STA	PLAYCNT
	STY	SPOS
	RTS
SETDELAY2	LDA	,Y+
	STA	SCNT
;	LDU	#PLAYSPEED	;ref
;	LDA	PLAYSPD
;	LDB	#2
;	MUL
;	LEAU	B,U
;	LDB	PLAYHALF
;	LEAU	B,U
;	LDA	0,U
	LDA	PLAYSPD
	STA	PLAYCNT
	STY	SPOS
	RTS
; reset
RESETSND	LDD	SSTART
	STD	SPOS
	LDA	LOOPY
	CMPA	#1
	BEQ	YUPLOOPY
	CLRA
	STA	PLAY
YUPLOOPY	LDA	PLAY
	LBNE	NODELAY
	RTS
; channel 1
SETCHAN1	LDX	#PSGDAT
	LDB	#2
	LDA	,Y+
	ADDA	KEY
	MUL
	LEAX	D,X
; x has tone
; next y has length
	LDA	PLAYSFX
	LBNE	BYPASSFX
	LDA	#1
	STA	YMREG
	LDA	0,X
	NOP
	NOP
	STA	YMDATA
	LDA	#0
	NOP
	NOP
	STA	YMREG
	LDA	1,X
	NOP
	NOP
	STA	YMDATA
; tone set?
	LDA	MSTVOL
	STA	VOL1
	LDA	,Y+
	LSRA
	STA	NLEN1
	CLR	VCNT1
	LBRA	MYLOOP
BYPASSFX	LDA	,Y+
	LBRA	MYLOOP
; channel 2
SETCHAN2	LDX	#PSGDAT
	LDB	#2
	LDA	,Y+
	ADDA	KEY
	MUL
	LEAX	D,X
; x has tone
; next y has length
	LDA	#3
	STA	YMREG
	LDA	0,X
	NOP
	NOP
	STA	YMDATA
	LDA	#2
	NOP
	NOP
	STA	YMREG
	LDA	1,X
	NOP
	NOP
	STA	YMDATA
; tone set?
	LDA	MSTVOL
	STA	VOL2
	LDA	,Y+
	LSRA
	STA	NLEN2
	CLR	VCNT2
	LBRA	MYLOOP
; channel 3
SETCHAN3	LDX	#PSGDAT
	LDB	#2
	LDA	,Y+
	ADDA	KEY
	MUL
	LEAX	D,X
; x has tone
; next y has length
	LDA	#5
	STA	YMREG
	NOP
	NOP
	LDA	0,X
	STA	YMDATA
	NOP
	NOP
	LDA	#4
	STA	YMREG
	LDA	1,X
	NOP
	NOP
	STA	YMDATA
; tone set?
	LDA	MSTVOL
	STA	VOL3
	LDA	,Y+
	LSRA
	STA	NLEN3
	CLR	VCNT3
	LBRA	MYLOOP
; perc1
PERC1	LDA	PLAYSFX
	LBNE	MYLOOP
	LDA	#7
	STA	YMREG
	NOP
	LDA	#49	; #48	;49
	STA	YMDATA
	NOP
	NOP
	LDA	#6
	STA	YMREG
	NOP
	NOP
	LDA	#31
	STA	YMDATA
	NOP
	NOP
	LDA	#1
	STA	PERCUS
	LDA	#2
	STA	PERCNT
	LDA	MSTVOL
	BEQ	SETVV1
	DECA
SETVV1	STA	VOL1
	LBRA	MYLOOP
PERC2	LDA	PLAYSFX
	LBNE	MYLOOP
	LDA	#7
	STA	YMREG
	NOP
	NOP
	LDA	#49	; #48	;49
	STA	YMDATA
	NOP
	LDA	#6
	STA	YMREG
	NOP
	NOP
	LDA	#5
	STA	YMDATA
	LDA	#1
	STA	PERCUS
	LDA	#3
	STA	PERCNT
	LDA	MSTVOL
	BEQ	SETVV2
	DECA
SETVV2	STA	VOL1
	LBRA	MYLOOP
; ********************************************************************
; * VOLUMES SMOOTH
; ********************************************************************
SETVOLUMES	LDA	VCNT1
	BEQ	TVDOWN1
	DEC	VCNT1
	BRA	NOTVDN1
TVDOWN1	LDA	VOL1
	BEQ	NOTVDN1
	DEC	VOL1
	LDA	NLEN1
	STA	VCNT1
NOTVDN1	LDA	#8
	STA	YMREG
	LDA	VOL1
	NOP
	NOP
	STA	YMDATA
	LDA	VCNT2
	BEQ	TVDOWN2
	DEC	VCNT2
	BRA	NOTVDN2
TVDOWN2	LDA	VOL2
	BEQ	NOTVDN2
	DEC	VOL2
	LDA	NLEN2
	STA	VCNT2
NOTVDN2	LDA	#9
	STA	YMREG
	LDA	VOL2
	NOP
	NOP
	STA	YMDATA
	LDA	VCNT3
	BEQ	TVDOWN3
	DEC	VCNT3
	BRA	NOTVDN3
TVDOWN3	LDA	VOL3
	BEQ	NOTVDN3
	DEC	VOL3
	LDA	NLEN3
	STA	VCNT3
NOTVDN3	LDA	#10
	STA	YMREG
	LDA	VOL3
	NOP
	NOP
	STA	YMDATA
	RTS
; ***************************************************************************************************
; * new sfx player
; ***************************************************************************************************
SFXPLAY	LDA	PLAYSFX
	BNE	PSFX0
	RTS
PSFX0	LDA	PLAYSFXCNT
	BEQ	PSFX1
; still counting
	DEC	PLAYSFXCNT
	RTS
DONESFX	CLR	PLAYSFX
	LDA	#7	;used to set a tone
	STA	YMREG
	LDA	#56
	NOP
	NOP
	STA	YMDATA	;enables sound
	RTS	;exit we are done
; process commands
PSFX1	LDX	PLAYSFXPOS
PSFX2	LDA	,X+
	BEQ	DONESFX
	CMPA	#86
	LBEQ	SETSFXVOL0	; volume **************************************
	CMPA	#79
	LBEQ	SETSFXOCTAVE	; octave ******************************************
	CMPA	#77
	LBEQ	SETSFXPERC0	; percussion
	CMPA	#78
	LBEQ	SETSFXPERC1	; percussion
	CMPA	#84
	LBEQ	SETSFXTEMPO	; tempo ******************************************
	CMPA	#80
	LBEQ	SETSFXDELAY	; pause ******************************************
	CMPA	#65
	BHS	TONESFX0
	BRA	PSFX2	;not a command?
TONESFX0	CMPA	#76
	BLS	TONESFX1
	BRA	PSFX2	; not a command
; set an sfx tone *****************************************************************************************************
TONESFX1	SUBA	#65
	STA	SFXTONE	;0-11 value
	LDY	#PSGDAT
	LDA	SFXOCTAVE
	LDB	#24
	MUL
	LEAY	D,Y
	LDA	SFXTONE
	LDB	#2
	MUL
	LEAY	D,Y	;ok its set
; sound card
	LDA	#7	;used to set a tone
	STA	YMREG
	LDA	#56
	NOP
	NOP
	STA	YMDATA	;enables sound
	NOP
	NOP
	LDA	#1
	STA	YMREG
	LDA	,Y
	NOP
	NOP
	STA	YMDATA
	LDA	#0
	NOP
	NOP
	STA	YMREG
	LDA	1,Y
	NOP
	NOP
	STA	YMDATA
; tone set?
	LDA	SFXVOL
	STA	VOL1
	LDA	PLAYSFXDEL
	STA	PLAYSFXCNT
	STA	NLEN1
	CLR	VCNT1
	STX	PLAYSFXPOS	;save position
	RTS
; ********************************************set volume sfx *****************************************************************
SETSFXVOL0	LDA	,X+
; 0-7  7=loud
	SUBA	#48
	LDB	#2
	MUL
	STB	SFXVOL
	LBRA	PSFX2
; **************************************** set octave sfx ******************************************************
SETSFXOCTAVE	LDA	,X+
	SUBA	#48
	STA	SFXOCTAVE
	LBRA	PSFX2
; **************************************** set sfx tempo **************************************************
SETSFXTEMPO	LDA	,X+
	SUBA	#48
	STA	PLAYSFXDEL
	LBRA	PSFX2
; **************************************** set sfx pause *************************************************
SETSFXDELAY	LDA	,X+
	SUBA	#48
	LDB	PLAYSFXDEL
	CMPB	#0
	BEQ	NOITSZEROSFX
	MUL
	STB	PLAYSFXCNT	;delay bigger
	STX	PLAYSFXPOS
	RTS
NOITSZEROSFX	STA	PLAYSFXCNT
	STX	PLAYSFXPOS
	RTS
; ******************************************** percussion 0 ******************************************
SETSFXPERC0	LDA	#7
	STA	YMREG
	NOP
	NOP
	LDA	#49	;49
	STA	YMDATA
	NOP
	NOP
	LDA	#6
	STA	YMREG
	NOP
	NOP
	LDA	#31
	STA	YMDATA
	LDA	SFXVOL
	STA	VOL1
	LDA	PLAYSFXDEL
	STA	PLAYSFXCNT
	STA	NLEN1
	CLR	VCNT1
	STX	PLAYSFXPOS	;save position
	RTS
; ***************************************** perc 1 ******************************************************
SETSFXPERC1	LDA	#7
	STA	YMREG
	NOP
	NOP
	LDA	#49	;49
	STA	YMDATA
	NOP
	NOP
	LDA	#6
	STA	YMREG
	NOP
	NOP
	LDA	#5
	STA	YMDATA
	LDA	SFXVOL
	STA	VOL1
	LDA	PLAYSFXDEL
	STA	PLAYSFXCNT
	STA	NLEN1
	CLR	VCNT1
	STX	PLAYSFXPOS	;save position
	RTS
ENDFUNCTION
; 
; 
FUNCTION	READJOYPAD	MPISDC,MPIPSG
DEF	MPISDC	BYTE
DEF	MPIPSG	BYTE
REM	; readjoypad(mpisdc,mpipsg)
REM	; returns both pad results to $15a $15b
YMMEMA	EQU	$FF5A
YMMEMB	EQU	$FF5B
YMCTRL	EQU	$FF5D
YMREG	EQU	$FF5E
YMDATA	EQU	$FF5F
MPIPSG	FCB	0
MPISDC	FCB	0
PADTYPEA	FCB	0
PADTYPEB	FCB	0
DPADU1	FCB	0	;up
DPADD1	FCB	0	;down
DPADL1	FCB	0	;left
DPADR1	FCB	0	;right
FIREA1	FCB	0	;a
FIREB1	FCB	0	;b
FIREC1	FCB	0	;c
FIRES1	FCB	0	;start
FIREX1	FCB	0	;x
FIREY1	FCB	0	;y
FIREZ1	FCB	0	;z
FIREM1	FCB	0	;mode
DPADU2	FCB	0	;up
DPADD2	FCB	0	;down
DPADL2	FCB	0	;left
DPADR2	FCB	0	;right
FIREA2	FCB	0	;a
FIREB2	FCB	0	;b
FIREC2	FCB	0	;c
FIRES2	FCB	0	;start
FIREX2	FCB	0	;x
FIREY2	FCB	0	;y
FIREZ2	FCB	0	;z
FIREM2	FCB	0	;mode
DATAA1	FCB	0
DATAA2	FCB	0
DATAA3	FCB	0
DATAA4	FCB	0
DATAA5	FCB	0
DATAA6	FCB	0
DATAA7	FCB	0
DATAA8	FCB	0
DATAA9	FCB	0
DATAB1	FCB	0
DATAB2	FCB	0
DATAB3	FCB	0
DATAB4	FCB	0
DATAB5	FCB	0
DATAB6	FCB	0
DATAB7	FCB	0
DATAB8	FCB	0
DATAB9	FCB	0
CARTSEL	FCB	0
; setup sound
READJOYPAD	LDB	MPISDC
	ANDB	#240
	STB	CARTSEL
	LDB	MPIPSG
	ANDB	#15
	ADDB	CARTSEL
	STB	$FF7F
	LDA	MPIPSG
	STA	$FF7F
; ok lets read the joypads
; cycle 1
	LDA	#22
	STA	YMCTRL
	LDA	#14
	STA	YMREG
	LDA	YMDATA
	STA	DATAA1
	LDA	#15
	STA	YMREG
	LDA	YMDATA
	STA	DATAB1
; cycle 2
	LDA	#16
	STA	YMCTRL
	LDA	#14
	STA	YMREG
	LDA	YMDATA
	STA	DATAA2
	LDA	#15
	STA	YMREG
	LDA	YMDATA
	STA	DATAB2
; cycle 3
	LDA	#22
	STA	YMCTRL
	LDA	#14
	STA	YMREG
	LDA	YMDATA
	STA	DATAA3
	LDA	#15
	STA	YMREG
	LDA	YMDATA
	STA	DATAB3
; cycle 4
	LDA	#16
	STA	YMCTRL
	LDA	#14
	STA	YMREG
	LDA	YMDATA
	STA	DATAA4
	LDA	#15
	STA	YMREG
	LDA	YMDATA
	STA	DATAB4
; cycle 5
	LDA	#22
	STA	YMCTRL
	LDA	#14
	STA	YMREG
	LDA	YMDATA
	STA	DATAA5
	LDA	#15
	STA	YMREG
	LDA	YMDATA
	STA	DATAB5
; cycle 6
	LDA	#16
	STA	YMCTRL
	LDA	#14
	STA	YMREG
	LDA	YMDATA
	STA	DATAA6
	LDA	#15
	STA	YMREG
	LDA	YMDATA
	STA	DATAB6
; cycle 7
	LDA	#22
	STA	YMCTRL
	LDA	#14
	STA	YMREG
	LDA	YMDATA
	STA	DATAA7
	LDA	#15
	STA	YMREG
	LDA	YMDATA
	STA	DATAB7
	LDX	#DPADU1
	LDB	#23
LP	CLR	B,X
	DECB
	BNE	LP
	CLR	0,X
; dont need any more
; lets figure out what pad is plugged in
; 0=atari,mastersystem
; 1=sega 3
; 2=sega 6
	CLR	PADTYPEA
	CLR	PADTYPEB
	LDA	DATAA6
	CMPA	DATAA1
	LBEQ	GETTP0A1	;go get type 0 buttons
	TSTA	#3
	BEQ	SEGA6A
	LDA	#1
	STA	PADTYPEA
	LBRA	GETTP1A1	
SEGA6A	LDA	#2
	STA	PADTYPEA
	LBRA	GETTP2A1
; type zero input on port a master or atari ctrl
GETTP0A1	LDX	#DPADU1
	LDB	#1
	LDA	DATAA1
	TSTA	#16
	BNE	TP0N1
	STB	4,X	;set on a
TP0N1	TSTA	#32
	BNE	TP0N2
	STB	5,X	;set on b
TP0N2	TSTA	#1
	BNE	TP0N3
	STB	0,X	;up on
TP0N3	TSTA	#2
	BNE	TP0N4
	STB	1,X	;down on
TP0N4	TSTA	#4
	BNE	TP0N5
	STB	2,X	;left on
TP0N5	TSTA	#8
	LBNE	PADCH2	;we done
	STB	3,X	;right on
	LBRA	PADCH2
; type one input sega 3 button ctrl
GETTP1A1	LDX	#DPADU1
	LDB	#1
	LDA	DATAA2
	TSTA	#16
	BNE	TP1N1
	STB	4,X	;set on a
TP1N1	LDA	DATAA1
	TSTA	#16
	BNE	TP1N6
	STB	5,X	;set on b
TP1N6	TSTA	#32
	BNE	TP1N2
	STB	6,X	;set c on
TP1N2	TSTA	#1
	BNE	TP1N3
	STB	0,X	;up on
TP1N3	TSTA	#2
	BNE	TP1N4
	STB	1,X	;down on
TP1N4	TSTA	#4
	BNE	TP1N5
	STB	2,X	;left on
TP1N5	TSTA	#8
	BNE	TP1N7
	STB	3,X	;right on
TP1N7	LDA	DATAA2
	TSTA	#32
	LBNE	PADCH2
	STB	7,X	;set start on
	LBRA	PADCH2
GETTP2A1	CLRA
; 
; 
; 
PADCH2	LDA	DATAB6
	CMPA	DATAB1
	BEQ	PADCHD
	TSTA	#3
	BEQ	SEGA6B
	LDA	#1
	STA	PADTYPEB
	BRA	PADCHD
SEGA6B	LDA	#2
	STA	PADTYPEB
; ok lets grab directions
PADCHD	LDD	PADTYPEA
	LDA	MPISDC
	STA	$FF7F
	LDX	#DPADU1
	RTS
ENDFUNCTION
; 
; **************************************************************************************
; * find the psg hardware
; **************************************************************************************
; returns d=0 error a=psg 0000 xxxx b=sdc xxxx xxxx
FUNCTION	FINDPSG
REM	; findpsg() returns d=0 on error not found
REM	; a=psg xxxx xxxx b=sdc xxxx xxxx
MPISDC	FCB	0	;locate boot slot save
MPIPSG	FCB	0	;locate psg slot save
CARTSEL	FCB	0	;cart select line
TEMP	FCB	0
BOOTSLOT	FCB	0
FOUNDPSG	FCB	0
YMCTRL	EQU	$FF5D
YMMEMA	EQU	$FF5A
; YMMEMB	EQU	$FF5B
; FLASH5555	EQU	$B5555
; FLASH2AAA	EQU	$BAAA
; exit error d=0  a=mpipsg 0000 xxxx     b= mpisdc xxxx xxxx
FINDPSG	LDA	$FF7F
	STA	BOOTSLOT
	ANDA	#240
	STA	MPISDC	;save boot mpi slot
	LDA	$FF7F
	ANDA	#15
	STA	CARTSEL
	ORCC	#$50
	CLRB
	STB	TEMP
TEST	LDA	TEMP
	CMPA	CARTSEL
	BEQ	SKIPTEST	;do not test boot slot for psg
	ADDA	MPISDC
	STA	$FF7F
; psg checks
	LDA	#24
	LDX	#YMCTRL
	STA	,X
	LDA	#191
	LDX	#YMMEMA
	STA	,X
	LDY	#$DFFF
	LDA	#253
	STA	,Y
	NOP
	LDA	,Y
	CMPA	#253
	BEQ	FOUNDPSG1
SKIPTEST	LDB	TEMP
	INCB
	STB	TEMP
	CMPB	#4
	BHS	EXITLOCATE
	BRA	TEST	;loop through all 4 slots
EXITLOCATE	CLR	FOUNDPSG
	LDA	MPISDC
	ADDA	CARTSEL
	STA	$FF7F
	ANDCC	#$EF
	CLRA
	CLRB
	RTS	;exit in error
FOUNDPSG1	LDA	#1
	STA	FOUNDPSG
	LDA	#16
	STA	YMCTRL
	LDA	TEMP
	LSLA
	LSLA
	LSLA
	LSLA
	ADDA	TEMP
	STA	MPIPSG	;XXXX xxxx
	LDA	MPISDC
	ADDA	CARTSEL
	STA	MPISDC	;xxxx xxxx
	LDA	BOOTSLOT
	STA	$FF7F
	ANDCC	#$EF
	LDA	MPIPSG	; exit with psg slot XXXX xxxx
	LDB	MPISDC	; exit with sdc slot xxxx xxxx
	RTS
ENDFUNCTION
;
